package com.data.construct.array;

/**
 * 数组（顺序存储）基本原理
 * 静态数组
 *
 * @author sunhl
 * @Description:
 * @Date: created in 2024/10/14 0014 10:48
 * @Modified By:
 */
public class ArrayBasicToKnow {

    public static void main(String[] args) {
        // 创建静态数组
        createStaticArray();

        // 向静态数组增加元素
        addElementToStaticArray();

        // 向静态数组删除元素
        delElementToStaticArray();

    }

    /**
     * 创建静态数组
     */
    private static void createStaticArray() {
        // 定义一个大小为 10 的静态数组
        int[] arr = new int[10];

        // 使用索引赋值
        arr[0] = 1;
        arr[1] = 2;

        // 使用索引取值
        int a = arr[0];
    }

    /**
     * 向静态数组增加元素
     */
    private static void addElementToStaticArray() {
        // 大小为 10 的数组已经装了 4 个元素
        int[] arr = new int[10];
        for (int i = 0; i < 4; i++) {
            arr[i] = i;
        }

        // 情况1, 数组末尾添加元素
        // 现在想在数组末尾追加一个元素 4
        arr[4] = 4;

        // 再在数组末尾追加一个元素 5
        arr[5] = 5;

        // 依此类推
        // ...


        // 情况2, 数组中间插入元素
        // 在第 3 个位置插入元素 666
        // 需要把第 3 个位置及之后的元素都往后移动一位
        // 注意要倒着遍历数组中已有元素避免覆盖，不懂的话请看下方可视化面板
        for (int i = 4; i > 2; i--) {
            arr[i] = arr[i - 1];
        }

        // 现在第 3 个位置空出来了，可以插入新元素
        arr[2] = 666;

        // 情况3, 数组空间已满
        // 现在想在数组末尾追加一个元素 10
        // 需要先扩容数组
        int[] newArr = new int[20];
        // 把原来的 10 个元素复制过去
        for (int i = 0; i < 10; i++) {
            newArr[i] = arr[i];
        }

        // 旧数组的内存空间将由垃圾收集器处理
        // ...

        // 在新的大数组中追加新元素
        newArr[10] = 10;
    }

    /**
     * 向静态数组删除元素
     */
    private static void delElementToStaticArray() {
        // 大小为 10 的数组已经装了 5 个元素
        int[] arr = new int[10];
        for (int i = 0; i < 5; i++) {
            arr[i] = i;
        }
        // 情况一，删除末尾元素
        // 删除末尾元素，暂时用 -1 代表元素已删除
        arr[4] = -1;

        // 情况二，删除中间元素
        // 删除 arr[1]
        // 需要把 arr[1] 之后的元素都往前移动一位
        // 注意要正着遍历数组中已有元素避免覆盖，不懂的话请看下方可视化面板
        for (int i = 1; i < 4; i++) {
            arr[i] = arr[i + 1];
        }

        // 最后一个元素置为 -1 代表已删除
        arr[4] = -1;
    }
}
